#pragma once
#include <iostream>
#include <ctime>
#include <cstdio>
#include <pthread.h>

#define INF 0
#define DBG 1
#define ERR 2

#define DEFAULT_LOG_LEVEL INF

#include <stdio.h>
#include <time.h>
#include <pthread.h>

#define LOG(level, format, ...)\
    {\
        if ((level) >= DEFAULT_LOG_LEVEL)\
        { \
            time_t t = time(NULL);\
            struct tm *m = localtime(&t);\
            char ts[32] = {0};\
            strftime(ts, sizeof(ts), "%H:%M:%S", m);\
            fprintf(stdout, "[%p %s %s:%d] " format "\n",\
                    (void *)pthread_self(), ts, __FILE__, __LINE__,\
                    ##__VA_ARGS__);\
        }\
    }

#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__);
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__);
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__);
